# Движок Сообщений

Как это было:

![oldogame_messages](/imgstore/oldogame_messages.jpg)

Доступ к игровым сообщениям осуществляется через меню `Сообщения`. Игровые сообщения могут быть сгенерированы игрой (шпионские и боевые доклады, сообщения о передвижении флотов и прочее) или другими игроками (например личные сообщения).

Принципиальной разницы между типами сообщений нет, с одним различием: на личные сообщения можно пожаловаться оператору.

Сообщение состоит из:
- Отправитель: указывается от кого пришло сообщение
- Заголовок: тема сообщения
- Тело: непосредственно сам текст сообщения

Все части сообщения хранятся в формате HTML, поэтому например в поле "Заголовок" может быть ссылка на боевой доклад.

Теперь немного деталей о принципах работы:
- Всего у пользователя может быть не более 127 сообщений. Если происходит переполнение, то самое старое сообщение удаляется и добавляется новое.
- Сообщение хранится 24 часа.
- В личных сообщениях можно использовать BB-коды:
	- Простые: `b` `u` `i` `s` `sub` `sup` `hr`
	- Цвет: `[color=ЦВЕТ][/color]`, размер `[size=РАЗМЕР][/size]`, шрифт `[font=FONT][/font]`, цитата `[quote=От кого][/quote]`
	- URL: `[url=ПУТЬ][/url]`, Email: `[email=EMAIL][/email]`, Картинка `[img=путь][/img]`
	- Выравнивание: `[align=left,right,center][/align]`
- Если в "от кого", теме или тексте сообщения есть слово `{PUBLIC_SESSION}`, то при выводе оно заменяется на текущую сессию пользователя.
- У каждого пользователя есть лимит сообщений в сутки. Выводится ошибка "Вы сегодня написали слишком много".

## API

Движок находится в файле `game/msg.php`

Программный интерфейс предоставляемый движком сообщений:
- `DeleteExpiredMessages`: Удалить все старые сообщения (вызывается из меню Сообщения)
- `DeleteOldestMessage`: Удалить самое старое сообщение (вызывается из `SendMessage`)
- `SendMessage`: Послать сообщение. Возвращает id нового сообщения. (может вызываться откуда угодно)
- `DeleteMessage`: Удалить сообщение (вызывается из меню Сообщения)
- `EnumMessages`: Загрузить последние N сообщений (вызывается из меню Сообщения).
- `UnreadMessages`: Получить количество непрочитанных сообщений (вызывается из Обзора)
- `MarkMessage`: Пометить сообщение как прочтенное (вызывается из меню Сообщения).

## Database

Структура таблицы `messages` в БД:

|столбец|SQL тип|описание|
|---|---|---|
|msg_id|INT PRIMARY KEY|Порядковый номер сообщения|
|owner_id|INT|Порядковый номер пользователя которому принадлежит сообщение|
|pm|INT|Тип сообщения, 0: личное сообщение (можно пожаловаться оператору), ...|
|msgfrom|TEXT|От кого, HTML|
|subj|TEXT|Тема, HTML, может быть текст, может быть ссылка на доклад|
|text|TEXT|Текст сообщения, HTML|
|shown|INT|0 - новое сообщение, 1 - показанное.|
|date|INT UNSIGNED|Дата сообщения|
